package com.LeeCode;

/**
 * 最少交换次数来组合所有的 1 II
 */

public class Code2134 {
    public static void main(String[] args) {
        int[] nums = {0, 1, 0, 1, 1, 0, 0};
        System.out.println(new Code2134().minSwaps(nums));

    }

    public int minSwaps(int[] nums) {
        int k = 0;
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            //统计滑动窗口k的个数,即窗口内应该要几个元素
            k += nums[i];
        }
        for (int j = 0; j < k; j++) {
            count+=1-nums[j];//交换次数其实就是统计一个窗口里有多少个0
            //第一个滑窗
        }
        int res = count;
        for (int start = k; start < nums.length + k; start++) {
            //因为是环形数组，所以至多能遍历到末尾+头部的k个元素(不包含这个k)
            //通过取余来确定
            if (nums[(start - k) % nums.length] == 0) {
                count--;
            }
            if (nums[start % nums.length] == 0) {
                count++;
            }
            res = Math.min(count, res);
        }
        return res;
    }
}
